#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
文档转换引擎使用示例

演示引擎的各种使用方式和配置选项
"""

import asyncio
import os
from pathlib import Path
import sys

# 添加项目根目录到Python路径
sys.path.append(str(Path(__file__).parent.parent))

from converter_engine import (
    CleanConverter, ConversionConfig, FileManagementConfig, ObsUploadConfig,
    load_config_auto, load_config_from_env
)

async def example_1_basic_usage():
    """示例1: 基础使用方式"""
    print("=" * 60)
    print("示例1: 基础使用方式")
    print("=" * 60)
    
    # 使用默认配置
    converter = CleanConverter()
    
    # 显示引擎状态
    print("🔧 引擎状态:")
    try:
        # 获取转换器状态信息
        status = converter.get_converter_status()
        print(f"   - 工作目录: {converter.config.work_temp_dir or '默认'}")
        print(f"   - 文件保留: {converter.config.file_management.keep_work_files}")
        print(f"   - 调试模式: {converter.config.file_management.debug_mode}")
        print(f"   - OBS上传: {converter.config.obs_upload.enabled}")
        print(f"   - 日志级别: {converter.config.log_level}")
    except Exception as e:
        print(f"   ⚠️  获取状态失败: {e}")
    
    # 模拟转换（请替换为真实文件路径）
    test_file = "test_document.pdf"  # 替换为实际文件
    
    if Path(test_file).exists():
        result = await converter.convert_file(test_file)
        
        if result.success:
            print(f"✅ 转换成功！")
            print(f"📄 文件ID: {result.file_id}")
            print(f"📝 Markdown长度: {len(result.markdown_content)} 字符")
            print(f"📁 工作目录: {result.work_dir}")
        else:
            print(f"❌ 转换失败: {result.error_message}")
    else:
        print(f"⚠️  测试文件不存在: {test_file}")
        print("💡 请创建一个测试文件或修改路径")

async def example_2_debug_mode():
    """示例2: 调试模式"""
    print("\n" + "=" * 60)
    print("示例2: 调试模式（保留所有文件）")
    print("=" * 60)
    
    # 配置调试模式
    config = ConversionConfig(
        file_management=FileManagementConfig(
            debug_mode=True,        # 启用调试模式
            keep_work_files=True    # 强制保留文件
        ),
        log_level="DEBUG"           # 详细日志
    )
    
    converter = CleanConverter(config)
    
    print("🔧 调试模式配置:")
    print(f"   - 调试模式: {config.file_management.debug_mode}")
    print(f"   - 保留文件: {config.file_management.keep_work_files}")
    print(f"   - 日志级别: {config.log_level}")
    
    # 模拟转换
    test_file = "test_document.pdf"
    
    if Path(test_file).exists():
        result = await converter.convert_file(test_file)
        
        if result.success:
            print(f"✅ 调试转换成功！")
            print(f"📁 所有中间文件保留在: {result.work_dir}")
            print("🔍 可以查看转换过程的详细文件")
        else:
            print(f"❌ 转换失败: {result.error_message}")
            print(f"📁 错误现场保留在: {result.work_dir}")
    else:
        print(f"⚠️  测试文件不存在: {test_file}")

async def example_3_obs_upload():
    """示例3: OBS上传配置"""
    print("\n" + "=" * 60)
    print("示例3: OBS上传配置")
    print("=" * 60)
    
    # OBS配置（请替换为真实配置）
    obs_config = {
        "access_key": "your_access_key",
        "secret_key": "your_secret_key", 
        "endpoint": "obs.cn-north-4.myhuaweicloud.com",
        "bucket": "your_bucket_name",
        "region": "cn-north-4"
    }
    
    config = ConversionConfig(
        obs_upload=ObsUploadConfig(
            enabled=True,               # 启用OBS上传
            obs_config=obs_config,      # OBS配置
            upload_types=["image"],     # 只上传图片
            storage_prefix="demo",      # 存储前缀
            replace_links=True          # 替换链接
        )
    )
    
    converter = CleanConverter(config)
    
    print("📤 OBS上传配置:")
    print(f"   - 启用状态: {config.obs_upload.enabled}")
    print(f"   - 上传类型: {config.obs_upload.upload_types}")
    print(f"   - 存储前缀: {config.obs_upload.storage_prefix}")
    print(f"   - 替换链接: {config.obs_upload.replace_links}")
    
    if config.obs_upload.obs_config:
        print(f"   - OBS端点: {config.obs_upload.obs_config['endpoint']}")
        print(f"   - 存储桶: {config.obs_upload.obs_config['bucket']}")
    
    print("⚠️  注意: 请配置真实的OBS参数才能进行上传测试")

async def example_4_specify_methods():
    """示例4: 指定转换方法"""
    print("\n" + "=" * 60)
    print("示例4: 指定不同文件的转换方法")
    print("=" * 60)
    
    converter = CleanConverter()
    
    # 定义测试文件和对应的转换方法
    test_cases = [
        ("document.pdf", "marker", "高质量PDF转换"),
        ("document.pdf", "docling", "快速PDF转换"),
        ("document.docx", "docling", "DOCX文档转换"),
        ("presentation.pptx", "pptx2md", "专业PPT转换"),
        ("image.png", "paddleocr", "中文OCR识别")
    ]
    
    print("📋 支持的转换方法:")
    for file_name, method, description in test_cases:
        print(f"   - {file_name} → {method} ({description})")
    
    # 如果有真实文件，可以测试转换
    print("\n💡 实际转换示例（需要真实文件）:")
    for file_name, method, description in test_cases:
        if Path(file_name).exists():
            print(f"🔄 正在测试: {file_name} 使用 {method}")
            result = await converter.convert_file(file_name, method)
            
            if result.success:
                print(f"✅ 成功: {description}")
            else:
                print(f"❌ 失败: {result.error_message}")
        else:
            print(f"⏭️  跳过: {file_name} (文件不存在)")

async def example_5_batch_conversion():
    """示例5: 批量转换"""
    print("\n" + "=" * 60)
    print("示例5: 批量转换示例")
    print("=" * 60)
    
    converter = CleanConverter()
    
    # 定义批量文件和转换方法
    files = [
        "doc1.pdf",
        "doc2.docx", 
        "presentation.pptx",
        "image.png"
    ]
    
    # 为每个文件指定转换方法
    methods = {
        "doc1.pdf": "marker",
        "doc2.docx": "docling",
        "presentation.pptx": "pptx2md",
        "image.png": "paddleocr"
    }
    
    print("📦 批量转换计划:")
    for file_path in files:
        method = methods.get(file_path, "auto")
        print(f"   - {file_path} → {method}")
    
    # 检查文件存在性
    existing_files = [f for f in files if Path(f).exists()]
    
    if existing_files:
        print(f"\n🔄 开始批量转换 {len(existing_files)} 个文件...")
        
        # 过滤方法字典
        existing_methods = {f: methods[f] for f in existing_files if f in methods}
        
        results = await converter.convert_files(existing_files, existing_methods)
        
        # 统计结果
        successful = sum(1 for r in results if r.success)
        print(f"\n📊 批量转换完成: {successful}/{len(existing_files)} 成功")
        
        for result in results:
            if result.success:
                print(f"✅ {result.file_id}: 转换成功")
            else:
                print(f"❌ {result.file_id}: {result.error_message}")
    else:
        print("⚠️  没有找到测试文件，跳过批量转换")
        print("💡 请创建测试文件: doc1.pdf, doc2.docx, presentation.pptx, image.png")

async def example_6_config_loading():
    """示例6: 配置加载方式"""
    print("\n" + "=" * 60)
    print("示例6: 不同的配置加载方式")
    print("=" * 60)
    
    # 方式1: 代码配置
    print("🔧 方式1: 代码配置")
    code_config = ConversionConfig(
        work_temp_dir="/tmp/converter_demo",
        file_management=FileManagementConfig(
            keep_work_files=False,
            debug_mode=False
        ),
        log_level="INFO"
    )
    print(f"   - 工作目录: {code_config.work_temp_dir}")
    print(f"   - 保留文件: {code_config.file_management.keep_work_files}")
    
    # 方式2: 环境变量配置
    print("\n🌍 方式2: 环境变量配置")
    print("   设置环境变量示例:")
    print("   export WORK_TEMP_DIR=/tmp/extractToMarkdown")
    print("   export KEEP_WORK_FILES=false")
    print("   export DEBUG_MODE=false")
    print("   export LOG_LEVEL=INFO")
    
    # 尝试从环境变量加载
    try:
        env_config = load_config_from_env()
        print(f"   ✅ 从环境变量加载成功")
        print(f"   - 工作目录: {env_config.work_temp_dir}")
    except Exception as e:
        print(f"   ⚠️  环境变量配置不完整: {e}")
    
    # 方式3: JSON配置文件
    print("\n📄 方式3: JSON配置文件")
    config_file = "demo_config.json"
    
    if Path(config_file).exists():
        try:
            from converter_engine import load_config_from_file
            file_config = load_config_from_file(config_file)
            print(f"   ✅ 从配置文件加载成功: {config_file}")
        except Exception as e:
            print(f"   ❌ 配置文件加载失败: {e}")
    else:
        print(f"   ⚠️  配置文件不存在: {config_file}")
        print("   💡 可以创建demo_config.json文件进行测试")
    
    # 方式4: 自动配置
    print("\n🤖 方式4: 自动配置（推荐）")
    try:
        auto_config = load_config_auto()
        print("   ✅ 自动配置加载成功")
        print("   📋 优先级: JSON文件 > 环境变量 > 默认配置")
    except Exception as e:
        print(f"   ❌ 自动配置失败: {e}")

async def example_7_error_handling():
    """示例7: 错误处理和排错"""
    print("\n" + "=" * 60)
    print("示例7: 错误处理和排错示例")
    print("=" * 60)
    
    converter = CleanConverter()
    
    # 测试不存在的文件
    print("🧪 测试1: 不存在的文件")
    result = await converter.convert_file("nonexistent_file.pdf")
    print(f"   结果: {'成功' if result.success else '失败'}")
    if not result.success:
        print(f"   错误: {result.error_message}")
    
    # 测试不支持的格式
    print("\n🧪 测试2: 不支持的文件格式")
    test_file = "test.xyz"
    Path(test_file).touch()  # 创建一个空文件
    
    result = await converter.convert_file(test_file)
    print(f"   结果: {'成功' if result.success else '失败'}")
    if not result.success:
        print(f"   错误: {result.error_message}")
    
    # 清理测试文件
    Path(test_file).unlink(missing_ok=True)
    
    # 测试不可用的转换方法
    print("\n🧪 测试3: 不可用的转换方法")
    if Path("test_document.pdf").exists():
        result = await converter.convert_file("test_document.pdf", "nonexistent_method")
        print(f"   结果: {'成功' if result.success else '失败'}")
        if not result.success:
            print(f"   错误: {result.error_message}")
    else:
        print("   ⚠️  跳过: 测试文件不存在")
    
    print("\n💡 错误排查建议:")
    print("   1. 开启调试模式查看详细信息")
    print("   2. 检查文件路径和权限")
    print("   3. 确认所需依赖已安装")
    print("   4. 查看工作目录是否有写入权限")

async def main():
    """主函数：运行所有示例"""
    print("🚀 文档转换引擎使用示例")
    print("=" * 60)
    print("这些示例展示了引擎的各种使用方式和配置选项")
    print("💡 请根据实际需要修改文件路径和配置参数")
    print()
    
    try:
        await example_1_basic_usage()
        await example_2_debug_mode()
        await example_3_obs_upload()
        await example_4_specify_methods()
        await example_5_batch_conversion()
        await example_6_config_loading()
        await example_7_error_handling()
        
        print("\n" + "=" * 60)
        print("🎉 所有示例运行完成！")
        print("📚 更多详细信息请查看: converter_engine/USAGE_GUIDE.md")
        print("=" * 60)
        
    except Exception as e:
        print(f"\n❌ 示例运行异常: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    # 运行示例
    asyncio.run(main()) 